package cn.steam.foo;

import java.util.Calendar;
import java.util.Locale;
import java.util.Random;

public abstract class Riven {

    private Riven() {
    }

    /**
     * 姓
     */
    private static final String[] FIRST_NAME = {
            "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",
            "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章",
            "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳",
            "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常",
            "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹",
            "姚", "邵", "湛", "汪", "祁", "上官", "欧阳", "诸葛", "东方", "公孙", "仲孙", "轩辕", "宇文", "长孙", "慕容"
    };

    /**
     * 名
     */
    private static final char[] LAST_NAME = {
            '嫣', '兆', '晟', '龙', '希', '珊', '蓓', '鹏', '育', '昭', '俊', '维', '傲', '然', '云', '焕', '举', '熙', '思', '伦', '远', '霖', '芳', '玉', '均',
            '全', '厉', '抒', '萍', '汐', '乐', '启', '山', '丞', '鸿', '星', '裕', '浩', '双', '凌', '富', '明', '旭', '佩', '语', '丰', '延', '轩', '皓', '梓',
            '若', '朗', '祺', '涛', '舟', '嫦', '情', '曦', '茹', '浪', '修', '樱', '恒', '昱', '成', '凯', '可', '平', '缘', '楚', '弘', '雅', '廷', '澜', '博',
            '果', '怡', '桂', '怀', '铸', '卫', '月', '天', '斌', '翰', '柏', '晴', '晓', '宾', '耀', '言', '琢', '亦', '悦', '梦', '高', '威', '湃', '烨', '滨',
            '阳', '颖', '舒', '菱', '勇', '彬', '玮', '澍', '运', '槐', '雨', '姐', '己', '灵', '钦', '邦', '竹', '煜', '会', '翠', '秀', '健', '庆', '信', '凡',
            '碧', '盈', '择', '译', '菲', '漫', '澎', '金', '美', '福', '淑', '娴', '珲', '新', '科', '琴', '冰', '硕', '瑶', '易', '孝', '睿', '熠', '书', '茜',
            '桦', '卿', '璇', '峪', '斐', '晖', '骇', '雪', '柳', '寒', '峻', '任', '婷', '甜', '御', '苛', '惊', '华', '磊', '莲', '岩', '彰', '玲', '敏', '杰',
            '兰', '昕', '曼', '筠', '政', '浠', '楠', '清', '虹', '谷', '勋', '汇', '晨', '翔', '立', '齐', '棋', '振', '子', '国', '泽', '惜', '岚', '媚', '宣',
            '艺', '伟', '顺', '如', '园', '铭', '夏', '佑', '智', '媛', '沛', '昇', '壮', '娇', '锐', '森', '雯', '婉', '青', '义', '佳', '芬', '聪', '涵', '豪',
            '韦', '炜', '尘', '丹', '竞', '惟', '忆', '正', '温', '从', '蕴', '庭', '鑫', '卓', '笑', '风', '泰', '家', '峰', '荣', '志', '元', '千', '惠', '亿',
            '彤', '淇', '英', '尉', '扬', '嘉', '晋', '瀚', '德', '瑜', '尚', '白', '圣', '悟', '欣', '祥', '昊', '渊', '又', '奕', '哲', '乾', '琼', '宸', '瑾',
            '叙', '波', '舜', '加', '彦', '诚', '仁', '荷', '贵', '靖', '文', '程', '琬', '宇', '才', '花', '栋', '源', '觉', '自', '馨', '东', '娜', '方', '海',
            '丽', '瑞', '雁'
    };

    /**
     * 手机号前3位
     */
    private static final String[] TEL_PREFIX = {
            "133", "149", "153", "173", "177", "180", "181",
            "189", "199", "130", "131", "132", "145", "155", "156", "166", "171", "175", "176",
            "185", "186", "166", "134", "135", "136", "137", "138", "139", "147", "150", "151",
            "152", "157", "158", "159", "172", "178", "182", "183", "184", "187", "188", "198",
            "170", "171"
    };

    /**
     * 身份证前2为，代表省份
     */
    private static final String[] PROVINCES = {"11", "12", "13", "14", "15", "21", "22", "23",
            "31", "32", "33", "34", "35", "36", "37", "41", "42", "43",
            "44", "45", "46", "50", "51", "52", "53", "54", "61", "62",
            "63", "64", "65", "71", "81", "82"
    };

    private static final String[] CITIES = {
            "北京", "天津", "河北石家庄", "河北唐山", "河北秦皇岛", "河北邯郸", "河北邢台", "河北保定", "河北张家口",
            "河北承德", "河北沧州", "河北廊坊", "河北衡水", "山西太原", "山西大同", "山西阳泉", "山西长治", "山西晋城", "山西朔州",
            "山西晋中", "山西运城", "山西忻州", "山西临汾", "山西吕梁", "山西晋中", "内蒙古呼和浩特", "内蒙古包头", "内蒙古乌海", "内蒙古赤峰",
            "内蒙古通辽", "内蒙古鄂尔多斯", "内蒙古呼伦贝尔", "内蒙古巴彦淖尔", "内蒙古乌兰察布", "内蒙古兴安盟", "内蒙古锡林郭勒", "内蒙古阿拉善盟",
            "辽宁沈阳", "辽宁大连", "辽宁鞍山", "辽宁抚顺", "辽宁本溪", "辽宁丹东", "辽宁锦州", "辽宁营口", "辽宁阜新", "辽宁辽阳", "辽宁盘锦", "辽宁铁岭",
            "辽宁朝阳", "辽宁葫芦岛", "吉林吉林", "吉林长春", "吉林吉林", "吉林四平", "吉林辽源", "吉林通化", "吉林白山", "吉林松原", "吉林白城", "吉林延边州",
            "黑龙江哈尔滨", "黑龙江齐齐哈尔", "黑龙江鸡西", "黑龙江鹤岗", "黑龙江双鸭山", "黑龙江大庆", "黑龙江伊春", "黑龙江佳木斯", "黑龙江七台河", "黑龙江牡丹江",
            "黑龙江黑河", "黑龙江绥化", "黑龙江哈尔滨", "黑龙江大兴安岭", "上海", "江苏南京", "江苏无锡", "江苏徐州", "江苏常州", "江苏苏州", "江苏南通",
            "江苏连云港", "江苏淮安", "江苏盐城", "江苏扬州", "江苏镇江", "江苏泰州", "浙江省杭州", "浙江省宁波", "浙江省温州", "浙江省嘉兴", "浙江省湖州",
            "浙江省绍兴", "浙江省金华", "浙江省衢州", "浙江省舟山", "浙江省台州", "浙江省丽水", "安徽合肥", "安徽芜湖", "安徽蚌埠", "安徽淮南", "安徽马鞍山",
            "安徽淮北", "安徽铜陵", "安徽安庆", "安徽黄山", "安徽滁州", "安徽阜阳", "安徽宿州", "安徽六安", "安徽亳州", "安徽池州", "安徽宣城", "安徽宿县",
            "福建福州", "福建厦门", "福建莆田", "福建三明", "福建泉州", "福建漳州", "福建南平", "福建龙岩", "福建宁德", "江西南昌", "江西景德镇", "江西萍乡",
            "江西九江", "江西新余", "江西鹰潭", "江西赣州", "江西吉安", "江西宜春", "江西抚州", "江西上饶", "山东济南", "山东青岛", "山东淄博", "山东枣庄",
            "山东东营", "山东烟台", "山东潍坊", "山东济宁", "山东泰安", "山东威海", "山东日照", "山东莱芜", "山东临沂", "山东德州", "山东聊城", "山东滨州",
            "山东菏泽", "河南郑州", "河南开封", "河南洛阳", "河南平顶山", "河南安阳", "河南鹤壁", "河南新乡", "河南焦作", "河南濮阳", "河南许昌", "河南漯河",
            "河南三门峡", "河南南阳", "河南商丘", "河南信阳", "河南周口", "河南驻马店", "湖北武汉", "湖北黄石", "湖北十堰", "湖北宜昌", "湖北襄阳", "湖北鄂州",
            "湖北荆门", "湖北孝感", "湖北荆州", "湖北黄冈", "湖北咸宁", "湖北随州", "湖北恩施州", "湖南长沙", "湖南株洲", "湖南湘潭", "湖南衡阳", "湖南邵阳",
            "湖南岳阳", "湖南常德", "湖南益阳", "湖南郴州", "湖南永州", "湖南怀化", "湖南娄底", "湖南湘西州", "广东广州", "广东韶关", "广东深圳", "广东珠海",
            "广东汕头", "广东佛山", "广东江门", "广东湛江", "广东茂名", "广东肇庆", "广东惠州", "广东梅州", "广东汕尾", "广东河源", "广东阳江", "广东清远",
            "广东东莞", "广东中山", "广东潮州", "广东揭阳", "广东云浮", "广西南宁", "广西柳州", "广西桂林", "广西梧州", "广西北海", "广西防城港", "广西钦州",
            "广西贵港", "广西玉林", "广西百色", "广西贺州", "广西河池", "广西来宾", "广西崇左", "广西贺州", "海南海口", "海南三亚", "海南三沙", "重庆",
            "四川成都", "四川自贡", "四川攀枝花", "四川泸州", "四川德阳", "四川绵阳", "四川广元", "四川遂宁", "四川内江", "四川乐山", "四川南充", "四川眉山",
            "四川宜宾", "四川广安", "四川达州", "四川巴中", "四川资阳", "四川凉山州", "贵州贵阳", "贵州六盘水", "贵州遵义", "贵州安顺", "贵州毕节", "贵州铜仁",
            "贵州黔西南州", "贵州黔东南州", "贵州黔南州", "云南昆明", "云南曲靖", "云南玉溪", "云南保山", "云南昭通", "云南丽江", "云南普洱", "云南临沧",
            "云南楚雄州", "云南红河州", "云南文山州", "云南西双版纳", "云南大理州", "云南德宏州", "云南怒江州", "云南迪庆州", "西藏拉萨", "西藏昌都",
            "西藏山南", "西藏日喀则", "西藏林芝", "陕西西安", "陕西铜川", "陕西宝鸡", "陕西咸阳", "陕西渭南", "陕西延安", "陕西汉中", "陕西榆林", "陕西安康",
            "陕西商洛", "甘肃省兰州", "甘肃省嘉峪关", "甘肃省金昌", "甘肃省白银", "甘肃省天水", "甘肃省武威", "甘肃省张掖", "甘肃省平凉", "甘肃省酒泉",
            "甘肃省庆阳", "甘肃省定西", "甘肃省陇南", "甘肃省临夏州", "甘肃省甘南州", "青海西宁", "青海海东", "青海海北州", "青海黄南州", "青海海南州", "青海果洛州",
            "青海玉树州", "青海海西州", "宁夏银川", "宁夏石嘴山", "宁夏吴忠", "宁夏固原", "宁夏中卫", "新疆乌鲁木齐", "新疆克拉玛依", "新疆吐鲁番", "新疆哈密",
            "新疆昌吉州", "新疆博尔塔拉州", "新疆巴音郭楞", "新疆克孜勒苏州", "新疆喀什地区", "新疆和田地区", "新疆伊犁州", "新疆塔城地区", "新疆石河子"
    };

    private static final String[] ENGLISH_NAME = {"Albert", "Aldrich", "Alexander", "Alfred", "Alger", "Allen", "Alston", "Alva",
            "Alvin", "Alvis", "Amos", "Andre", "Andrew", "Andy", "Angelo", "Ansel", "Antony", "Antoine", "Antonio", "Archer", "Archibald",
            "Aries", "Arlen", "Armand", "Armstrong", "Arno", "Arnold", "Arthur", "Arvin", "Asa", "Atwood", "Aubrey", "August", "Augustine",
            "Avery", "Bancroft", "Bard", "Barlow", "Barnett", "Baron", "Barret", "Barry", "Bartholomew", "Bart", "Barton", "Bartley", "Basil", "Christ",
            "Christian", "Christopher", "Clare", "Clarence", "Clark", "Claude", "Clement", "Cleveland", "Cliff", "Clifford", "Clyde", "Colbert", "Colby",
            "Colin", "Conrad", "Corey", "Cornelius", "Cornell", "Craig", "Cyril", "Dana", "Daniel", "Darcy", "Darren", "Dave", "David", "Dean",
            "Dempsey", "Dennis", "Derrick", "Devin", "Dick", "Dominic", "Don", "Donald", "Douglas", "Drew", "Duke", "Duncan", "Dunn", "Dwight", "Dylan", "Ed",
            "Eden", "Edgar", "Edmund", "Edison", "Edward", "Egbert", "Eli", "Elijah", "Elliot", "Ellis", "Elmer", "Elroy", "Elton", "Elvis", "Emmanuel",
            "Enoch", "Eric", "Ernest", "Eugene", "Evan", "Fabian", "Felix", "Ferdinand", "Fitch", "Fitzgerald", "Ford", "Francis", "Frank", "Franklin",
            "Frederic", "Gabriel", "Gale", "Gary", "Gavin", "Gene", "Geoffrey", "Geoff", "George", "Gerald", "Gilbert", "Giles", "Glenn", "Goddard",
            "Gordon", "Greg", "Griffith", "Grover", "Gustave", "Guy", "Ogden", "Oliver", "Omar", "Orville", "Osborn", "Oscar", "Oswald",
            "Otis", "Otto", "Owen", "Payne", "Perry", "Pete", "Peter", "Phil", "Philip", "Porter", "Prescott", "Primo", "Rachel", "Randolph", "Raymond",
            "Reg", "Regan", "Reginald", "Reuben", "Rex", "Richard", "Robert", "Robin", "Rock", "Rod", "Roderick", "Rodney", "Ron", "Ronald", "Rory", "Roy", "Rudolf",
            "Rupert", "Ryan", "Sam", "Sampson", "Samuel", "Sandy", "Saxon", "Scott", "Sean"
    };

    private static final String[] EMAIL_SUFFIX = {"@gmail.com", "@yahoo.com", "@msn.com", "@hotmail.com", "@aol.com", "@ask.com", "@live.com", "@qq.com", "@0355.net",
            "@163.com", "@163.net", "@263.net", "@3721.net", "@189.com"};

    /**
     * @return 随机生成的中文姓名
     */
    public static String name() {
        Random random = new Random();
        String firstName = FIRST_NAME[random.nextInt(FIRST_NAME.length - 1)];
        int x = random.nextInt(2) + 1;
        StringBuilder lastName = new StringBuilder();
        for (int i = 0; i < x; i++) {
            lastName.append(LAST_NAME[random.nextInt(LAST_NAME.length - 1)]);
        }
        return firstName + lastName;
    }

    public static String englishName() {
        return ENGLISH_NAME[new Random().nextInt(ENGLISH_NAME.length)];
    }

    /**
     * 返回概率相等的“1” or “0”
     *
     * @return “1” or “0”
     */
    public static int sex() {
        Random random = new Random();
        return random.nextInt(2);
    }

    /**
     * 根据权重返回 “1” or “0”
     *
     * @param weight1 "1" 权重，最小值为1
     * @param weight0 “0” 权重，最小值为1
     * @return “1” or “0”
     */
    public static int sex(int weight1, int weight0) {
        Random random = new Random();
        int i = random.nextInt(weight1 + weight0);
        return i < weight1 ? 1 : 0;
    }

    /**
     * @return 随机生成11位数字的手机号码
     */
    public static String telephone() {
        Random random = new Random();
        StringBuilder suffix = new StringBuilder();
        // 后八位
        int length = 8;
        for (int i = 0; i < length; i++) {
            suffix.append(random.nextInt(10));
        }
        int i = random.nextInt(TEL_PREFIX.length);
        return TEL_PREFIX[i] + suffix;
    }

    /**
     * @param age 年龄
     * @return 随机生成的身份证号码
     */
    public static String idCard(int age) {
        Random random = new Random();
        // String id = "421022199703149999";
        int i = random.nextInt(PROVINCES.length);
        StringBuilder id = new StringBuilder(PROVINCES[i]);

        // 代表城市的4位数字
        int cityLength = 4;
        for (int j = 0; j < cityLength; j++) {
            id.append(random.nextInt(10));
        }

        // 根据年龄计算出出生年份,ex:2020-20 =2000
        Calendar calendar = Calendar.getInstance();
        id.append(calendar.get(Calendar.YEAR) - age);

        // 代表月份的2位数字，1-12,小于10月份加0填充
        int ten = 10;
        int month = random.nextInt(12) + 1;
        if (month < ten) {
            id.append(0);
        }
        id.append(month);

        int day = random.nextInt(27) + 1;
        if (day < ten) {
            id.append(0);
        }
        id.append(day);

        //随机生成最后4位
        int last4 = 4;
        for (int j = 0; j < last4; j++) {
            id.append(random.nextInt(10));
        }
        return id.toString();
    }

    /**
     * 年龄：18~68
     */
    public static int age() {
        Random random = new Random();
        return random.nextInt(60) + 18;
    }

    /**
     * 城市
     */
    public static String city() {
        return CITIES[new Random().nextInt(CITIES.length)];
    }

    /**
     * 邮箱
     */
    public static String email(String name) {
        return name.toLowerCase(Locale.ROOT) + EMAIL_SUFFIX[new Random().nextInt(EMAIL_SUFFIX.length)];
    }

}
